//谁调用this，this指向谁
function func() {
    console.log(this)
}
func()

const a = {
    name: 'jhy',
    say() {
        console.log('我是' + this.name);
    },
    eat(food1,food2){
        console.log('我喜欢吃'+food1+food2);
    }
}
const b = {
    name: 'zrh'
}
//call,apply,bind三个改变this的值
// call跟apply都是直接调用这个函数，bind不调用
//call() call接受参数，第一个参数是将this指向改变的值，之后的参数是方法里的参数
a.say()//jhy
a.eat('鸡鸭','鱼肉')//鸡鸭鱼肉
a.say.call(b)//zrh
a.eat.call(b,'鸡鸭','鱼肉')
//apply()跟call一样，但是接收参数的时候是数组形式
a.say()//jhy
a.eat('鸡鸭','鱼肉')//鸡鸭鱼肉
a.say.apply(b)//zrh
a.eat.apply(b,['鸡鸭','鱼肉'])
//bind()，跟call使用一样，但是不会调用函数，他会把函数作为返回值返回
let result = a.eat.bind(b,'鸡鸭','鱼肉')
result()

//箭头函数的this指向上一级
const food = {
    name: this,
    write: () => {
        console.log(this)
    }
}
console.log(food.name)
food.write()


// 1. 全局执行环境中, 指向全局对象(非严格模式、严格模式)

// 2. 如何开启严格模式:

// 为整个脚本开启严格模式
// 'use strict'
// function func() {
//   // 为函数开启严格模式
//   'use strict'
// }

// 3. 函数内部, 取决于函数被调用的方式

// 3.1 直接调用的this值:
// 3.1.1 非严格模式: 全局对象(window)
// 3.1.2 严格模式: undefined

// 3.2 对象方法调用时的this值为调用者